<?php

class Auth_Adapter_VkCode implements Zend_Auth_Adapter_Interface
{
	/**
	 * @var string
	 */
	protected $_code;
	
	/**
     * @param string $code
     * @return void
     */
    public function __construct($code)
    {
    	$this->_code = $code;
    }

	/**
     * Пытаемся авторизоваться по коду. Процесс авторизации описан по ссылке ниже.
     *
     * @link http://vk.com/developers.php?oid=-1&p=%D0%90%D0%B2%D1%82%D0%BE%D1%80%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%B0%D0%B9%D1%82%D0%BE%D0%B2
     * @throws Zend_Auth_Adapter_Exception If authentication cannot be performed
     * @return Zend_Auth_Result
     */
    public function authenticate()
    {
    	$client = VkClient::getInstance();
    	$uri = $client->getAccessTokenByCodeUrl($this->_code);
    	$client->setUri($uri);
    	$response = $client->request();
    	
    	$json = json_decode($response->getBody(), true);
    	if (!$userId = $json['user_id']) {
    		throw new Zend_Auth_Exception('При авторизации API вконтакте не отдало user_id');
    	}
    	
    	// После получения токена - получаем пользователя по его ID
    	$select = UserPeer::getInstance()->select();
    	$select->where('vk_id = ?', $userId);
    	$userRow = UserPeer::getInstance()->fetchRow($select);
    	if (!$userRow) {
    		// Если пользователя у нас еще нет - регистрируем его
    		$user = VkApi::getInstance()->getUser(array(
    				'uids' => $userId,
    				'fields' => 'first_name,last_name'
    		));
    			
    		$userRow = UserPeer::getInstance()->createRow();
    		$userRow->setVkId($user['uid']);
    		$userRow->setName($user['first_name']);
    		$userRow->setLastName($user['last_name']);
    		$userRow->setCreated(date('Y-m-d H:i:s'));
    		$userRow->save();
    	}
    	
    	return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS, $userRow->getId(), array());
    }
}
